package sad.controle;

import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import javax.swing.JMenu;
import javax.swing.JOptionPane;
import javax.swing.event.MenuEvent;
import sad.dao.DAO;
import sad.dao.DisciplinaTableDAO;
import sad.dao.ProfessorTableDAO;
import sad.dao.SubTopicoTableDAO;
import sad.dao.TopicoTableDAO;
import sad.modelo.Disciplina;
import sad.modelo.Professor;
import sad.modelo.SubTopico;
import sad.modelo.Topico;
import sad.util.Constantes;
import sad.util.DAOEvent;
import sad.visao.FabricaDeDialog;
import sad.visao.SadGUI;

public class MasterControl extends AbstractControl {
/* Ao iniciar a classe MasterControl, o metodo run instancia
   a classe SadGui que abre o formulario principal*/  
  private SadGUI v_geral;

  public void run() {
    this.v_geral = new SadGUI();
    v_geral.setLocationRelativeTo(null);
    v_geral.setVisible(true);
    //o metodo add ouvinte adiciona a ação dos botões, menus e janelas do formulario principal 
    addOuvinte();
    //o metodo abaixo verifica o conteudo das listas para mostrar nos relatorios
    //e atualiza variavel de classe numXXX para o controle de objetos criados
    verificaListas();
  }
  
 // <editor-fold defaultstate="collapsed" desc="Responde a eventos com origem nas visões">
    @Override
    /* quando o suporteEvento escuta alguma ação no objeto sadGui,
       então é chamado o metodo abaixo. Cada objeto tem um actionCommand, quando
       dispara algum evento o metodo getActionCommand recupera o actionCommand
       e dependendo do actionCommand ele vai criar o JDialog correnspodente*/
    public void actionPerformed(ActionEvent e) {
            /*Para que um objeto tipo jDialog seja criado a classe chama o metodo criarDialog
              da classe FabricaDeDialog*/
        if(e.getActionCommand().equals(Constantes.NOVO_PROFESSOR)){
            FabricaDeDialog.criarDialog(v_geral, Constantes.PROFESSOR, null);
        }
        if(e.getActionCommand().equals(Constantes.NOVA_DISCIPLINA)){
            FabricaDeDialog.criarDialog(v_geral, Constantes.DISCIPLINA, null);
        }
        if(e.getActionCommand().equals(Constantes.NOVO_TOPICO)){
            FabricaDeDialog.criarDialog(v_geral, Constantes.TOPICO, null);
        }
        if(e.getActionCommand().equals(Constantes.NOVO_SUBTOPICO)){
            FabricaDeDialog.criarDialog(v_geral, Constantes.SUBTOPICO, null);
        }
        if(e.getActionCommand().equals(Constantes.NOVA_QUESTAO)){
            FabricaDeDialog.criarDialog(v_geral, Constantes.QUESTAO, null);
        }
        if(e.getActionCommand().equals(Constantes.NOVA_AVALIACAO)){
            FabricaDeDialog.criarDialog(v_geral, Constantes.AVALIACAO, null);
        }
        if(e.getActionCommand().equals(Constantes.RELATORIO_PROFESSOR)){
            FabricaDeDialog.criarDialog(v_geral, Constantes.RELATORIO_PROFESSOR, null);
        }
        if(e.getActionCommand().equals(Constantes.RELATORIO_DISCIPLINA)){
            FabricaDeDialog.criarDialog(v_geral, Constantes.RELATORIO_DISCIPLINA, null);
        }
        if(e.getActionCommand().equals(Constantes.RELATORIO_TOPICO)){
            FabricaDeDialog.criarDialog(v_geral, Constantes.RELATORIO_TOPICO, null);
        }
        if(e.getActionCommand().equals(Constantes.RELATORIO_SUBTOPICO)){
            FabricaDeDialog.criarDialog(v_geral, Constantes.RELATORIO_SUBTOPICO , null);
        }
        if(e.getActionCommand().equals(Constantes.RELATORIO_QUESTAO)){
                FabricaDeDialog.criarDialog(v_geral, Constantes.RELATORIO_QUESTAO, null);
        }

    }

    @Override
    public void windowClosing(WindowEvent e){
        if(e.getID()==WindowEvent.WINDOW_CLOSING){
            closeWindow();   
        }
    }

    @Override
    public void menuSelected(MenuEvent e){
        if(((JMenu)e.getSource()).getActionCommand().equals("Sair")){
                closeWindow();
        }
    }// </editor-fold>
    
 // <editor-fold defaultstate="collapsed" desc="Enchaminha eventos com origem no DAO">
    @Override
    public void daoChange(DAOEvent e) {
           v_geral.modelDAOChange(e);
    }// </editor-fold>
    
  private void addOuvinte() {
        v_geral.addActionListener(this);
        v_geral.addWindowOuvinte(this);
        v_geral.addMenuOuvinte(this);
        ProfessorTableDAO.getInstance().addDAOOuvinte(this);
        DisciplinaTableDAO.getInstance().addDAOOuvinte(this);
        TopicoTableDAO.getInstance().addDAOOuvinte(this);
        SubTopicoTableDAO.getInstance().addDAOOuvinte(this);
        
  }
  
  private void closeWindow(){
      int option = JOptionPane.showConfirmDialog(v_geral,"Desejar sair?",
                                       null, JOptionPane.OK_CANCEL_OPTION);
      if (option==0){
           DAO.closeObjectContainer();
           v_geral.close();
      }
  }

    private void verificaListas() {
        isExists(Professor.class, Constantes.DISCIPLINA);
        isExists(Disciplina.class, Constantes.TOPICO);
        isExists(Topico.class, Constantes.SUBTOPICO);
        isExists(SubTopico.class, Constantes.AVALIACAO);
    }
    
    private void isExists(Object obj, String constante) {
        int size = DAO.getListObjects(obj).length;
        if (size != 0) v_geral.enableMenu(constante);
    }
}
